from phe import paillier# Python-Paillier同态加密库
import base64# 用于数据编码
import json# 用于JSON序列化

def generate_key_pair():
    """
    生成同态加密的公钥和私钥对
    使用Paillier库生成密钥对
    返回的公钥用于加密，私钥用于解密
    Paillier是一种加法同态加密算法，支持密文上的加法运算

    """
    public_key, private_key = paillier.generate_paillier_keypair()
    return public_key, private_key


def encrypt_token(data, public_key):
    """
    使用同态加密加密数据
    输入：原始数据和公钥
    使用公钥加密数据
    返回加密后的数据对象

    """
    encrypted_data = public_key.encrypt(data)
    return encrypted_data

def decrypt_token(encrypted_data, private_key):
    """
    使用同态加密解密数据
    输入：加密数据和私钥
    使用私钥解密数据
    返回原始数据

    """
    return private_key.decrypt(encrypted_data)

def serialize_encrypted_data(encrypted_data):
    """
    将加密数据序列化为字符串
    将加密数据转换为可存储的格式
    保存密文和指数两个关键参数
    使用JSON序列化后进行Base64编码
    返回可以安全存储的字符串

    """
    # 使用phe官方推荐方式：保存ciphertext和exponent
    payload = {
        'ciphertext': str(encrypted_data.ciphertext()),
        'exponent': encrypted_data.exponent,
    }
    return base64.b64encode(json.dumps(payload).encode()).decode()

def deserialize_encrypted_data(serialized_data, public_key):
    """
    将序列化的加密数据反序列化
    将存储的字符串转回加密数据对象
    Base64解码后解析JSON
    使用公钥重建EncryptedNumber对象
    返回可以进行同态运算的加密数据对象

    """
    # 反序列化为phe的EncryptedNumber
    payload = json.loads(base64.b64decode(serialized_data.encode()).decode())
    return paillier.EncryptedNumber(public_key, int(payload['ciphertext']), int(payload['exponent']))

def generate_homomorphic_token():
    """
    生成完整的同态加密令牌
    包含加密的令牌值、公钥和私钥
    令牌值使用基础值1000（可配置）

    """
    public_key, private_key = generate_key_pair()
    # 生成一个随机数作为令牌的基础值
    base_value = 1000  # 可以根据需要调整
    encrypted_token = encrypt_token(base_value, public_key)
    
    # 序列化加密数据
    serialized_token = serialize_encrypted_data(encrypted_token)
    
    return {
        'token': serialized_token,
        'public_key': str(public_key.n),  # 只存储n
        'private_key': private_key
    }